<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <script>

    // 不能独立使用、必须继承后才能使用的类。

    class Shape {
        constructor() {
            if (new.target === Shape) {
            throw new Error('本类不能实例化');
            }
        }
    }

    class Rectangle extends Shape {
        constructor(length, width) {
            super();
            // ...
        }
    }

    var x = new Shape();  // 报错
    var y = new Rectangle(3, 4);  // 正确
    // 上面代码中，Shape类不能被实例化，只能用于继承。

    // function Person(name) {
    //     if (new.target === Person) {
    //         this.name = name;
    //     } else {
    //         throw new Error('必须使用 new 命令生成实例');
    //     }
    //     myname=function() {return this.name};
    //     return myname;
    // }
    // // var person = new Person('张三'); // 正确
    // // var notAPerson = Person.call(person, '张三');  // 报错
    // var notAPerson2=Object.create(Person);
    // console.log(notAPerson2);
    // console.log(Reflect.getPrototypeOf(notAPerson2)(11)());

        // class Logger {
        //     constructor() {
        //     }
        //     printName(name = 'there') {
        //         this.print(`Hello ${name}`);
        //     }
        //     print(text) {
        //         console.log(text);
        //     }
        // }
        // function selfish (target) {
        //     const cache = new WeakMap();
        //     const handler = {
        //         get (target, key) {
        //         const value = Reflect.get(target, key);
        //         if (typeof value !== 'function') {
        //             return value;
        //         }
        //         if (!cache.has(value)) {
        //             cache.set(value, value.bind(target));
        //         }
        //         return cache.get(value);
        //         }
        //     };
        //     const proxy = new Proxy(target, handler);
        //     return proxy;
        // }

        // const logger = selfish(new Logger());

        // const { printName } = logger;
        // printName("hello2"); // TypeError: Cannot read property 'print' of undefined



        // class Logger {

        //     constructor() {
        //     //  this.printName = this.printName.bind(this);
        //         this.printName= (name="there") =>{
        //             this.print(`Hello ${name}`);
        //         }

        //     }
        // // printName(name = 'there') {
        // //      this.print(`Hello ${name}`);
        // // }

        //     print(text) {
        //         console.log(text);
        //     }
        // }

        // const logger = new Logger();
        // const { printName } = logger;
        // printName("hello2"); // TypeError: Cannot read property 'print' of undefined

    //   class A {
    //         #foo = 0;
    //         static test(obj) {
    //             console.log(#foo in obj);
    //         }
    //     }
    //     const a = new A();

    //     const o1 = Object.create(a);
    //     A.test(o1) // false
    //     A.test(o1.__proto__) // true

    //     const o2 = {};
    //     Object.setPrototypeOf(o2, a);
    //     A.test(o2) // false
    //     A.test(o2.__proto__) // true

        // class IncreasingCounter {
        //     #count = 0;
        //     get value() {
        //         console.log('Getting the current value!');
        //         return this.#count;
        //     }
        //     increment() {
        //         this.#count++;
        //     }
        // }
        
        // let ic=new IncreasingCounter();
        // ic.increment();
        // console.log(ic.value);
  


        // class MyClass {
        //     static myStaticProp = 42;

        //     constructor() {
        //         console.log(MyClass.myStaticProp); // 42
        //     }
            
        // }
        // let mclass=new MyClass();

        // class IncreasingCounter {
        //     // 实例属性 注意不是原型属性
        //     _count=0;
        //     constructor() {
        //         // this._count = 0;
        //     }
        //     get value() {
        //         console.log('Getting the current value!');
        //         return this._count;
        //     }
        //     increment() {
        //         this._count++;
        //     }
        // }

        // let ic=new IncreasingCounter();
        // ic.increment();
        // console.log(ic.value);

        // let ic2=new IncreasingCounter();
        // ic2.increment();
        // console.log(ic2.value);
        // console.log(IncreasingCounter);

        // class Point {
        //     constructor(x, y) {
        //         this.x = x;
        //         this.y = y;
        //     }

        //     toString() {
        //         return '(' + this.x + ', ' + this.y + ')';
        //     }
        // }

        // var point = new Point(2, 3);
        // console.log(point);
        // point.toString() // (2, 3)

        // point.hasOwnProperty('x') // true
        // point.hasOwnProperty('y') // true
        // point.hasOwnProperty('toString') // false
        // point.__proto__.hasOwnProperty('toString') // true

        // class Foo {
        //     static bar() {
        //         this.baz();
        //     }
        //     static baz() {
        //         console.log('hello');
        //     }
        //     baz() {
        //         console.log('world');
        //     }
        // }

        // console.log(Foo);
        // Foo.bar() // hello


        // const baz = function baz() {
        //     return 'world';
        // }
        // class Mybaz {
        //     // baz() {
        //     //     return 'world';
        //     // }
        //     get baz(){ return 'aa'}

        // }

        // console.log((new Mybaz).baz);


    </script>
</head>

<body>

</body>

</html>